# -*- coding: utf-8 -*-
# 姓名:谚语
# 开发时间:2022/6/12 15:44
import jwt
from jwt import PyJWTError

from comment.utils import const
from flask import current_app
from comment.modules.user import User
from datetime import datetime, timedelta


# 要生成用户的token令牌，可以根据每个用户的id生成
def generate_tokens(uid):
    """
    一个用户再一次会话中生成一个token
    :param uid: 用户id
    :return:
    """
    params = {
        'id': uid,
        # exp 代表token的有效时间
        # datetime.utcnow() 代表当前系统时间  timedelta()  将秒转为标准时间(毫秒)
        'exp': datetime.utcnow() + timedelta(seconds=const.JWT_EXPIRY_SECOND)
    }
    # jwt.encode() 加密，加密之后得到的是字节数据
    # 参数1: 根据什么样的参数生成token，参数2: 密钥，参数3: 计算机算法
    # SHA-256: 密码的散列函数算法（本质是哈希函数算法）,256bit(字节)长的哈希值(也称之为信息摘要，密文),不可逆
    # [相当于32数组]--->十六进制字符串来表示，字符长度是64
    return jwt.encode(payload=params, key=const.SECRET_KEY, algorithm='HS256')  # 算法是: SHA-256


def ver_tokens(token_str):
    """
    验证token，如果验证成功，返回用户ID
    :param token_str:
    :return:
    """
    try:
        # 返回之前生产token的时候的字典
        # jwt.decode()验证，参数1: 加密后的字典，参数2: 密钥，参数3: 计算机算法
        data = jwt.decode(token_str, key=const.SECRET_KEY, algorithms='HS256')
        current_app.logger.info(data)
    except PyJWTError as e:
        current_app.logger.info(e)
        return {'message': 'token 验证失败'}
        # query 查询  filter 过滤  first 一条
    user = User.query.filter(User.id == data['id']).first()
    # onlock 锁定（失效）
    if user and user.onlock == 0:  # 当前用户状态正常
        return {'id': user.id}
    return {'message': '数据库中不存在当前用户，或用户已经过期'}



    # except PyJWKError as e:
    #     # 得到当前的app进而得到日志输出对象logger输出日志级别error
    #     current_app.logger.error(e)
    #     return {'message': 'token验证失败'}
